#include<bits/stdc++.h>
using namespace std;
namespace IO{
    const int BUF=1<<21;
    char buff[BUF],*p1=buff,*p2=buff;
    #define gc() (p1==p2&&(p2=((p1=buff)+fread(buff,1,BUF,stdin)),p1==p2)?EOF:*p1++)
    template<typename T>inline void read(T &x){
        char ch=gc();x=0;int f=1;
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=gc();}
        while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=gc();
        x*=f;
    }
}
using namespace IO;
const int N=1e6+5;
int n,C,a[N],root,tot;
#define ll long long
const ll inf=1ll<<60;
struct Treap{
	int ls,rs,pos,l,r;
	ll val,mi,tag,tagi;
}t[N<<1];
mt19937 rnd(1145141);
inline int make(int l,int r,ll v){
	t[++tot]=(Treap){0,0,(int)rnd(),l,r,v,inf,0,0};
	return tot;
}
inline void ins1(int p,ll v){if(p)t[p].tag+=v,t[p].val+=v;}
inline void ins2(int p,ll v){if(p)t[p].tagi+=v,t[p].val+=v*t[p].l,t[p].mi-=v;}
inline void pushdown(int p){
	if(t[p].tag){
		ins1(t[p].ls,t[p].tag);
		ins1(t[p].rs,t[p].tag);
		t[p].tag=0;
	}
	if(t[p].tagi){
		ins2(t[p].ls,t[p].tagi);
		ins2(t[p].rs,t[p].tagi);
		t[p].tagi=0;
	}
}
inline ll up(ll x,ll y){return (x+y-1)/y;}
inline void pushup(int p){
	Treap &ls=t[t[p].ls],&rs=t[t[p].rs];
	t[p].mi=min(ls.mi,rs.mi);
	if(t[p].ls) t[p].mi=min(t[p].mi,up(ls.val-t[p].val,t[p].l-ls.l));
	if(t[p].rs) t[p].mi=min(t[p].mi,up(t[p].val-rs.val,rs.l-t[p].l));
}
void merge(int x,int y,int &p){
	if(!x||!y) return p=x^y,void();
	pushdown(x),pushdown(y);
	if(t[x].pos<t[y].pos) merge(t[x].rs,y,t[p=x].rs);
	else merge(x,t[y].ls,t[p=y].ls);
	pushup(p);
}
void split(int p,int &x,int &y,int k){
	if(!p) return x=y=0,void();
	pushdown(p);
	if(t[p].l>k) split(t[p].ls,x,t[y=p].ls,k);
	else if(t[p].r<=k) split(t[p].rs,t[x=p].rs,y,k);
	else{
		y=make(k+1,t[p].r,t[p].val);
		t[p].r=k;
		merge(y,t[p].rs,y);
		t[p].rs=0;
		pushup(y);
	}
	pushup(p);
}
void update(int p){
	pushdown(p);
	Treap &ls=t[t[p].ls],&rs=t[t[p].rs];
	if(ls.mi==0) update(t[p].ls);
	else if(t[p].ls&&ls.val<=t[p].val){
		pushdown(t[p].ls);
		t[p].val=ls.val,t[p].l=ls.l;
		merge(ls.ls,ls.rs,t[p].ls);
	}else if(t[p].rs&&t[p].val<=rs.val){
		pushdown(t[p].rs);
		t[p].r=rs.r;
		merge(rs.ls,rs.rs,t[p].rs);
	}else update(t[p].rs);
	pushup(p);
}
void dfs(int p){
	if(!p) return;
	pushdown(p);
	dfs(t[p].ls);
	cerr<<t[p].l<<' '<<t[p].r<<' '<<t[p].val<<'\n';
	dfs(t[p].rs);
}
int main(){
	read(n),read(C);
	t[0].mi=inf;
	root=make(0,(int)1e9+5,0);
	for(int i=1;i<=n;++i){
		read(a[i]);
		int x,y;
		split(root,x,y,a[i]-1);
		cerr<<"XXXXXXXXXXX\n";
		dfs(x);
		cerr<<"YYYYYYYYY\n";
		dfs(y);
		ins1(x,C);
		ins1(y,-a[i]),ins2(y,1);
		cerr<<"MIOIIII"<<t[y].val<<'\n';
		while(t[y].mi<=0) update(y);
		merge(x,y,root);cerr<<"RRRRRRRRRRRoot\n";
		dfs(root);cerr<<'\n';
	}
	while(t[root].rs) pushdown(root),root=t[root].rs;
	cout<<t[root].val;
	return 0;
}


